import type { ReactNode } from 'react';
import type { 
  IScheduleTemplate, 
  IScheduleTemplateCreateRequest, 
  IScheduleTemplateUpdateRequest, 
  IScheduleTemplateQueryParams,
  IScheduleTemplateSummary,
  IScheduleTemplateDetail
} from './scheduleTemplate';
import type {
  IScheduleInstance,
  IScheduleInstanceCreateRequest,
  IScheduleInstanceUpdateRequest,
  IScheduleInstanceQueryParams,
  IScheduleInstanceSummary,
  IScheduleInstanceDetail,
  IScheduleInstanceConflict
} from './scheduleInstance';
import type { 
  DayOfWeekEnum, 
  ScheduleViewTypeEnum, 
  ScheduleActionEnum,
  AttendanceStatusEnum 
} from './enums';
import type { IMixedScheduleData } from './scheduleApi';

// ==================== 课程安排模板组件 Props 类型 ====================

/**
 * 课程安排模板卡片组件 Props
 * @description 课程安排模板卡片组件的属性接口
 */
export interface IScheduleTemplateCardProps {
  /** 课程安排模板信息 */
  template: IScheduleTemplate;
  /** 学生信息 */
  student?: { id: string; name: string };
  /** 课程信息 */
  course?: { id: string; name: string; color: string; teacher: string };
  /** 是否显示详细信息 */
  showDetails?: boolean;
  /** 是否可编辑 */
  editable?: boolean;
  /** 是否可删除 */
  deletable?: boolean;
  /** 是否显示操作按钮 */
  showActions?: boolean;
  /** 自定义操作按钮 */
  actions?: ReactNode;
  /** 点击编辑回调 */
  onEdit?: (template: IScheduleTemplate) => void;
  /** 点击删除回调 */
  onDelete?: (templateId: string) => void;
  /** 点击查看实例回调 */
  onViewInstances?: (templateId: string) => void;
  /** 点击卡片回调 */
  onClick?: (template: IScheduleTemplate) => void;
  /** 自定义样式类名 */
  className?: string;
  /** 是否加载中 */
  loading?: boolean;
}

/**
 * 课程安排模板表单组件 Props
 * @description 课程安排模板表单组件的属性接口
 */
export interface IScheduleTemplateFormProps {
  /** 编辑的模板信息（编辑模式时传入） */
  template?: IScheduleTemplate;
  /** 可选的学生列表 */
  students: Array<{ id: string; name: string; studentId: string }>;
  /** 可选的课程列表 */
  courses: Array<{ id: string; name: string; courseCode: string; teacher: string; color: string }>;
  /** 表单模式 */
  mode?: 'create' | 'edit' | 'view';
  /** 是否显示表单 */
  visible: boolean;
  /** 是否只读模式 */
  readonly?: boolean;
  /** 表单标题 */
  title?: string;
  /** 提交回调 */
  onSubmit: (data: IScheduleTemplateCreateRequest | IScheduleTemplateUpdateRequest) => void | Promise<void>;
  /** 取消回调 */
  onCancel: () => void;
  /** 表单验证失败回调 */
  onValidationError?: (errors: Record<string, string>) => void;
  /** 时间冲突检查回调 */
  onConflictCheck?: (data: {
    studentId: string;
    dayOfWeek: DayOfWeekEnum;
    startTime: string;
    endTime: string;
  }) => Promise<IScheduleInstanceConflict[]>;
  /** 是否提交中 */
  loading?: boolean;
  /** 自定义样式类名 */
  className?: string;
}

// ==================== 课程实例组件 Props 类型 ====================

/**
 * 课程实例卡片组件 Props
 * @description 课程实例卡片组件的属性接口
 */
export interface IScheduleInstanceCardProps {
  /** 课程实例信息 */
  instance: IScheduleInstance;
  /** 学生信息 */
  student?: { id: string; name: string };
  /** 课程信息 */
  course?: { id: string; name: string; color: string; teacher: string };
  /** 模板信息 */
  template?: { id: string; totalCount: number; completedCount: number };
  /** 是否显示详细信息 */
  showDetails?: boolean;
  /** 是否可编辑 */
  editable?: boolean;
  /** 是否可删除 */
  deletable?: boolean;
  /** 是否显示操作按钮 */
  showActions?: boolean;
  /** 自定义操作按钮 */
  actions?: ReactNode;
  /** 点击编辑回调 */
  onEdit?: (instance: IScheduleInstance) => void;
  /** 点击删除回调 */
  onDelete?: (instanceId: string) => void;
  /** 点击完成回调 */
  onComplete?: (instanceId: string) => void;
  /** 点击取消回调 */
  onCancel?: (instanceId: string, reason?: string) => void;
  /** 点击重新安排回调 */
  onReschedule?: (instanceId: string) => void;
  /** 点击标记出勤回调 */
  onMarkAttendance?: (instanceId: string, status: AttendanceStatusEnum) => void;
  /** 点击卡片回调 */
  onClick?: (instance: IScheduleInstance) => void;
  /** 自定义样式类名 */
  className?: string;
  /** 是否加载中 */
  loading?: boolean;
}

// ==================== 课表视图组件 Props 类型 ====================

/**
 * 每日课表视图组件 Props
 * @description 每日课表视图组件的属性接口
 */
export interface IDailyScheduleViewProps {
  /** 显示日期 */
  date: string;
  /** 课程实例列表 */
  scheduleInstances: IScheduleInstanceSummary[];
  /** 学生列表 */
  students: Array<{ id: string; name: string; color?: string }>;
  /** 课程列表 */
  courses: Array<{ id: string; name: string; color: string; teacher: string }>;
  /** 视图模式 */
  viewMode: 'single' | 'multiple';
  /** 选中的学生ID列表 */
  selectedStudents: string[];
  /** 是否显示时间轴 */
  showTimeAxis?: boolean;
  /** 时间轴范围 */
  timeRange?: { start: string; end: string };
  /** 时间间隔（分钟） */
  timeInterval?: number;
  /** 是否显示空时间段 */
  showEmptySlots?: boolean;
  /** 点击实例回调 */
  onInstanceClick?: (instance: IScheduleInstanceSummary) => void;
  /** 点击时间段回调 */
  onTimeSlotClick?: (time: string) => void;
  /** 日期变化回调 */
  onDateChange?: (date: string) => void;
  /** 学生选择变化回调 */
  onStudentSelectionChange?: (studentIds: string[]) => void;
  /** 自定义样式类名 */
  className?: string;
  /** 是否加载中 */
  loading?: boolean;
}

/**
 * 周历视图组件 Props
 * @description 周历视图组件的属性接口
 */
export interface IWeeklyCalendarViewProps {
  /** 周开始日期 */
  weekStartDate: string;
  /** 课程实例列表 */
  scheduleInstances: IScheduleInstanceSummary[];
  /** 学生列表 */
  students: Array<{ id: string; name: string; color?: string }>;
  /** 课程列表 */
  courses: Array<{ id: string; name: string; color: string; teacher: string }>;
  /** 选中的学生ID列表 */
  selectedStudents: string[];
  /** 是否显示周末 */
  showWeekend?: boolean;
  /** 是否显示时间轴 */
  showTimeAxis?: boolean;
  /** 时间轴范围 */
  timeRange?: { start: string; end: string };
  /** 时间间隔（分钟） */
  timeInterval?: number;
  /** 点击日期回调 */
  onDateClick?: (date: string) => void;
  /** 点击实例回调 */
  onInstanceClick?: (instance: IScheduleInstanceSummary) => void;
  /** 点击时间段回调 */
  onTimeSlotClick?: (date: string, time: string) => void;
  /** 周变化回调 */
  onWeekChange?: (weekStartDate: string) => void;
  /** 学生选择变化回调 */
  onStudentSelectionChange?: (studentIds: string[]) => void;
  /** 自定义样式类名 */
  className?: string;
  /** 是否加载中 */
  loading?: boolean;
}

/**
 * 混合课表视图组件 Props
 * @description 混合课表视图组件的属性接口
 */
export interface IMixedScheduleViewProps {
  /** 选中的学生ID列表 */
  selectedStudents: string[];
  /** 混合课表数据 */
  scheduleData: IMixedScheduleData;
  /** 视图类型 */
  viewType: ScheduleViewTypeEnum;
  /** 显示日期范围 */
  dateRange: { start: string; end: string };
  /** 是否显示学生颜色区分 */
  showStudentColors?: boolean;
  /** 是否显示冲突提示 */
  showConflicts?: boolean;
  /** 是否显示时间轴 */
  showTimeAxis?: boolean;
  /** 时间轴范围 */
  timeRange?: { start: string; end: string };
  /** 点击学生切换回调 */
  onStudentToggle?: (studentId: string) => void;
  /** 点击课程实例回调 */
  onScheduleClick?: (instance: IScheduleInstanceSummary) => void;
  /** 点击时间段回调 */
  onTimeSlotClick?: (date: string, time: string, students: string[]) => void;
  /** 视图类型变化回调 */
  onViewTypeChange?: (viewType: ScheduleViewTypeEnum) => void;
  /** 日期范围变化回调 */
  onDateRangeChange?: (dateRange: { start: string; end: string }) => void;
  /** 自定义样式类名 */
  className?: string;
  /** 是否加载中 */
  loading?: boolean;
}

/**
 * 课表冲突对话框组件 Props
 * @description 课表冲突对话框组件的属性接口
 */
export interface IScheduleConflictDialogProps {
  /** 冲突列表 */
  conflicts: IScheduleInstanceConflict[];
  /** 是否显示对话框 */
  visible: boolean;
  /** 对话框标题 */
  title?: string;
  /** 是否允许强制保存 */
  allowForceSave?: boolean;
  /** 解决冲突回调 */
  onResolve?: (resolution: {
    action: 'cancel' | 'force_save' | 'modify_time';
    params?: Record<string, unknown>;
  }) => void;
  /** 取消回调 */
  onCancel?: () => void;
  /** 自定义样式类名 */
  className?: string;
}

// ==================== 课表工具组件 Props 类型 ====================

/**
 * 课表搜索组件 Props
 * @description 课表搜索组件的属性接口
 */
export interface IScheduleSearchProps {
  /** 搜索关键词 */
  keyword?: string;
  /** 高级筛选条件 */
  filters?: {
    templateFilters?: IScheduleTemplateQueryParams;
    instanceFilters?: IScheduleInstanceQueryParams;
  };
  /** 可选的学生列表 */
  students?: Array<{ id: string; name: string }>;
  /** 可选的课程列表 */
  courses?: Array<{ id: string; name: string }>;
  /** 是否显示高级筛选 */
  showAdvancedFilters?: boolean;
  /** 搜索类型 */
  searchType?: 'templates' | 'instances' | 'both';
  /** 搜索占位符 */
  placeholder?: string;
  /** 搜索回调 */
  onSearch: (keyword: string, filters?: {
    templateFilters?: IScheduleTemplateQueryParams;
    instanceFilters?: IScheduleInstanceQueryParams;
  }) => void;
  /** 重置搜索回调 */
  onReset?: () => void;
  /** 筛选条件变化回调 */
  onFiltersChange?: (filters: {
    templateFilters?: IScheduleTemplateQueryParams;
    instanceFilters?: IScheduleInstanceQueryParams;
  }) => void;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课表统计组件 Props
 * @description 课表统计组件的属性接口
 */
export interface IScheduleStatisticsProps {
  /** 统计数据 */
  statistics?: {
    totalTemplates: number;
    activeTemplates: number;
    completedTemplates: number;
    totalInstances: number;
    completedInstances: number;
    cancelledInstances: number;
    attendanceRate: number;
    studentDistribution: Array<{ studentName: string; count: number }>;
    courseDistribution: Array<{ courseName: string; count: number }>;
    dayOfWeekDistribution: Array<{ dayOfWeek: DayOfWeekEnum; count: number }>;
  };
  /** 是否加载中 */
  loading?: boolean;
  /** 是否显示图表 */
  showCharts?: boolean;
  /** 图表类型 */
  chartType?: 'pie' | 'bar' | 'line';
  /** 统计时间范围 */
  dateRange?: { start: string; end: string };
  /** 点击统计项回调 */
  onStatisticClick?: (type: string, value: string) => void;
  /** 时间范围变化回调 */
  onDateRangeChange?: (dateRange: { start: string; end: string }) => void;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 课表操作按钮组件 Props
 * @description 课表操作按钮组件的属性接口
 */
export interface IScheduleActionButtonsProps {
  /** 目标对象（模板或实例） */
  target: IScheduleTemplate | IScheduleInstance;
  /** 目标类型 */
  targetType: 'template' | 'instance';
  /** 可用的操作列表 */
  actions?: ScheduleActionEnum[];
  /** 按钮大小 */
  size?: 'small' | 'middle' | 'large';
  /** 按钮类型 */
  type?: 'default' | 'primary' | 'text' | 'link';
  /** 是否禁用 */
  disabled?: boolean;
  /** 操作回调 */
  onAction: (action: ScheduleActionEnum, target: IScheduleTemplate | IScheduleInstance) => void;
  /** 自定义样式类名 */
  className?: string;
}

/**
 * 时间选择器组件 Props
 * @description 时间选择器组件的属性接口
 */
export interface ITimeRangePickerProps {
  /** 开始时间 */
  startTime?: string;
  /** 结束时间 */
  endTime?: string;
  /** 时间格式 */
  format?: string;
  /** 时间间隔（分钟） */
  minuteStep?: number;
  /** 是否禁用 */
  disabled?: boolean;
  /** 占位符 */
  placeholder?: [string, string];
  /** 时间变化回调 */
  onChange: (startTime: string, endTime: string) => void;
  /** 时间验证回调 */
  onValidate?: (startTime: string, endTime: string) => string | null;
  /** 自定义样式类名 */
  className?: string;
}